/**
 * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
 *
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
 * copy, modify, and distribute this software in source code or binary form for use
 * in connection with the web services and APIs provided by Facebook.
 *
 * As with any software that integrates with the Facebook platform, your use of
 * this software is subject to the Facebook Developer Principles and Policies
 * [http://developers.facebook.com/policy/]. This copyright notice shall be
 * included in all copies or substantial portions of the software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package com.facebook.share.model;

import android.os.Parcel;

/**
 * Provides the interface for video content to be shared.
 * 
 * A general use builder is available in {@link ShareVideoContent.Builder}.
 */
public final class ShareVideoContent extends ShareContent<ShareVideoContent, ShareVideoContent.Builder> implements ShareModel {
	private final String contentDescription;
	private final String contentTitle;
	private final SharePhoto previewPhoto;
	private final ShareVideo video;

	private ShareVideoContent(final Builder builder) {
		super(builder);

		this.contentDescription = builder.contentDescription;
		this.contentTitle = builder.contentTitle;
		this.previewPhoto = builder.previewPhoto;
		this.video = builder.video;
	}

	ShareVideoContent(final Parcel in) {
		super(in);
		this.contentDescription = in.readString();
		this.contentTitle = in.readString();
		SharePhoto.Builder previewPhotoBuilder = new SharePhoto.Builder().readFrom(in);
		if (previewPhotoBuilder.getImageUrl() != null || previewPhotoBuilder.getBitmap() != null) {
			this.previewPhoto = previewPhotoBuilder.build();
		} else {
			this.previewPhoto = null;
		}
		this.video = new ShareVideo.Builder().readFrom(in).build();
	}

	/**
	 * The description of the video.
	 * 
	 * @return The description of the video.
	 */

	public String getContentDescription() {
		return this.contentDescription;
	}

	/**
	 * The title to display for this video.
	 * 
	 * @return The video title.
	 */

	public String getContentTitle() {
		return this.contentTitle;
	}

	/**
	 * Photo to be used as a preview for the video.
	 * 
	 * @return Preview {@link SharePhoto} for the content.
	 */

	public SharePhoto getPreviewPhoto() {
		return this.previewPhoto;
	}

	/**
	 * Video to be shared.
	 * 
	 * @return {@link ShareVideo}
	 */

	public ShareVideo getVideo() {
		return this.video;
	}

	public int describeContents() {
		return 0;
	}

	public void writeToParcel(final Parcel out, final int flags) {
		super.writeToParcel(out, flags);
		out.writeString(this.contentDescription);
		out.writeString(this.contentTitle);
		out.writeParcelable(this.previewPhoto, 0);
		out.writeParcelable(this.video, 0);
	}

	@SuppressWarnings("unused")
	public static final Creator<ShareVideoContent> CREATOR = new Creator<ShareVideoContent>() {
		public ShareVideoContent createFromParcel(final Parcel in) {
			return new ShareVideoContent(in);
		}

		public ShareVideoContent[] newArray(final int size) {
			return new ShareVideoContent[size];
		}
	};

	/**
	 * Builder for the {@link com.facebook.share.model.ShareVideoContent}
	 * interface.
	 */
	public static final class Builder extends ShareContent.Builder<ShareVideoContent, Builder> {
		private String contentDescription;
		private String contentTitle;
		private SharePhoto previewPhoto;
		private ShareVideo video;

		/**
		 * Sets the description of the video.
		 * 
		 * @param contentDescription
		 *            The description of the video.
		 * @return The builder.
		 */
		public Builder setContentDescription(final String contentDescription) {
			this.contentDescription = contentDescription;
			return this;
		}

		/**
		 * Sets the title to display for this video.
		 * 
		 * @param contentTitle
		 *            The video title.
		 * @return The builder.
		 */
		public Builder setContentTitle(final String contentTitle) {
			this.contentTitle = contentTitle;
			return this;
		}

		/**
		 * Sets the photo to be used as a preview for the video.
		 * 
		 * @param previewPhoto
		 *            Preview {@link com.facebook.share.model.SharePhoto} for
		 *            the content.
		 * @return The builder.
		 */
		public Builder setPreviewPhoto(final SharePhoto previewPhoto) {
			this.previewPhoto = (previewPhoto == null ? null : new SharePhoto.Builder().readFrom(previewPhoto).build());
			return this;
		}

		/**
		 * Sets the video to be shared.
		 * 
		 * @param video
		 *            {@link com.facebook.share.model.ShareVideo}
		 * @return The builder.
		 */
		public Builder setVideo(final ShareVideo video) {
			if (video == null) {
				return this;
			}

			this.video = new ShareVideo.Builder().readFrom(video).build();
			return this;
		}

		@Override
		public ShareVideoContent build() {
			return new ShareVideoContent(this);
		}

		@Override
		public Builder readFrom(final ShareVideoContent model) {
			if (model == null) {
				return this;
			}
			return super.readFrom(model).setContentDescription(model.getContentDescription()).setContentTitle(model.getContentTitle()).setPreviewPhoto(model.getPreviewPhoto()).setVideo(model.getVideo());
		}

		@Override
		public Builder readFrom(final Parcel parcel) {
			return this.readFrom((ShareVideoContent) parcel.readParcelable(ShareVideoContent.class.getClassLoader()));
		}

	}
}
